﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;

namespace Guarouba.Classes
{
    public static class Tools
    {
        /// <summary>
        /// Classe para encriptar um texto (String).
        /// </summary>
        /// <param name="data">Texto (string) a ser criptografada.</param>
        /// <returns>String criptografada.</returns>
        public static string Encript(string data)
        {
            try
            {
                byte[] encData_byte = new byte[data.Length];
                encData_byte = System.Text.Encoding.UTF8.GetBytes(data);
                string encodedData = Convert.ToBase64String(encData_byte);
                return encodedData;
            }
            catch (Exception ex)
            {
                throw new Exception("Erro ao encriptar string. " + ex.Message);
            }
        }

        /// <summary>
        /// Classe para decriptar uma string Base64.
        /// </summary>
        /// <param name="data">Texto (string) a ser decriptada.</param>
        /// <returns>String decriptada.</returns>
        public static string Decript(string data)
        {
            try
            {
                System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
                System.Text.Decoder utf8Decode = encoder.GetDecoder();

                byte[] todecode_byte = Convert.FromBase64String(data);
                int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
                char[] decoded_char = new char[charCount];
                utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
                string result = new String(decoded_char);
                return result;
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("Erro ao decriptar string. Detalhes: {0}", ex.Message));
            }
        }

        /// <summary>
        /// Classe que retorna um valor em formato string, do arquivo de configuração
        /// do sistema (conf.ini).
        /// </summary>
        /// <param name="chave">Chave no arquivo (app key).</param>
        /// <returns>String</returns>
        public static string PegarChaveConfiguracao(string chave)
        {
            return ConfigurationManager.AppSettings[chave].ToString();
        }

        /// <summary>
        /// Classe que retorna o valor de uma QueryString decriptada, caso haja a chave
        /// informada na URL.
        /// </summary>
        /// <param name="chave">Paramêtro da QueryString</param>
        /// <returns>String</returns>
        public static string PegarQueryString(string chave)
        {
            try
            {
                if (HttpContext.Current.Request.QueryString[chave] != null)
                {
                    string ret = HttpContext.Current.Request.QueryString[chave].ToString();
                    ret = Decript(ret);
                    return ret;
                }

                return null;
            }
            catch (Exception ex)
            {                
                throw new Exception(ex.Message);
            }            
        }

        /// <summary>
        /// Retorna o ID (int) do usuário logado. Pega o valor no Cookie do navegador.
        /// </summary>
        /// <returns>Int</returns>
        public static int PegarIDUsuarioLogado()
        {
            try
            {
                if (HttpContext.Current.Request.Cookies["grba"] != null)
                {
                    string idUsuario = HttpContext.Current.Request.Cookies["grba"]["IDUsuario"].ToString();
                    idUsuario = Decript(idUsuario);

                    int idUsuario_;
                    bool isNumero = int.TryParse(idUsuario, out idUsuario_);
                    if (!isNumero)
                        throw new Exception("Não foi possível resgatar o ID do usuário.");

                    return idUsuario_;
                }
                else
                {
                    throw new Exception("Usuário não logado no sistema.");
                }
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("Erro critíco ao resgatar ID do usuário. Detalhes: {0}", ex.Message));
            }        
        }

        public static void DesabilitarTodosCamposInputs()
        {
            
        }
    }
}